//
//  UITextView+Extension.swift
//  weibo
//
//  Created by 王旭 on 16/5/3.
//  Copyright © 2016年 王旭. All rights reserved.
//

import UIKit

extension UITextView {
    
    // 将表情图片转成表情字符串以发送到新浪微博
    var emoticonText: String? {
        var result = ""
        let attr = self.attributedText
        // 遍历富文本里面的内容
        attr.enumerateAttributesInRange(NSMakeRange(0, attr.length), options: []) { (dict, range, _) -> Void in
            //            print(dict)
            //            print("===================")
            if let atta = dict["NSAttachment"] as? WXTextAttachment {
                print(atta.emoticon?.chs)
                // 是表情，取到表情的描述字符串
                result += atta.emoticon?.chs ?? ""
            }else{
                // 不是表情，是文字 ，所以我们需要截取
                result += (attr.string as NSString).substringWithRange(range)
            }
        }
        
        return result
    }
    
    
    /// 添加一个表情到当前textView里面去
    ///
    /// - parameter emoticon: <#emoticon description#>
    func insertEmoticon(emoticon: WXEmotionModel) {
        // 1.  将现有文字生成一个 NSMutableAttributedString
        let originalAttr = NSMutableAttributedString(attributedString: self.attributedText)
        
        // 2. 通过表情模型生成表情图片 --> 通过图片生成 NSTextAttachment --> 通过 attachment 生成一个 NSAttributedString
        let image = UIImage(named: "\(emoticon.folderName ?? "")/\(emoticon.png ?? "")", inBundle: WXEmotionViewModel.sharedEmotionViewModel.emotionBundel, compatibleWithTraitCollection: nil)
        // 通过图片生成NSTextAttachment
        //        let attatchment = NSTextAttachment()
        let attatchment = WXTextAttachment()
        attatchment.emoticon = emoticon
        attatchment.image = image
        // 设置图片的大小
        let attachmentHW = self.font!.lineHeight
        attatchment.bounds = CGRect(x: 0, y: -4, width: attachmentHW, height: attachmentHW)
        // 通过 attachment 生成一个 NSAttributedString
        let attr = NSAttributedString(attachment: attatchment)
        
        // 3. 将第2部生成的 NSAttributedString 添加到第1步生成的 NSMutableAttributedString 里面
        // 添加到原有富文本里面
        // 以方法会把图标拼接到原来的文本的最后面，如果光标不是在最后面的话，就会出现bug
        // originalAttr.appendAttributedString(attr)
        
        // 获取光标所在的位置
        var selectedRange = self.selectedRange
        // originalAttr.insertAttributedString(attr, atIndex: selectedRange.location)
        originalAttr.replaceCharactersInRange(selectedRange, withAttributedString: attr)
        
        // 设置字体大小
        originalAttr.addAttribute(NSFontAttributeName, value: self.font!, range: NSMakeRange(0, originalAttr.length))
        // 4. 将第3步的执行结果赋值给 textView.attributedText
        self.attributedText = originalAttr
        // 设置光标位置
        selectedRange.location += 1
        selectedRange.length = 0
        self.selectedRange = selectedRange
        
        
        // 发送文字改变的通知
        NSNotificationCenter.defaultCenter().postNotificationName(UITextViewTextDidChangeNotification, object: self)
        
        // 调用文字改变的代理方法
        delegate?.textViewDidChange?(self)
    }
}

